/**
 * @author Vitor Franco do Carmo (vitor.carmo@capgemini.com)
 * @since 28/03/2013
 *
 */
package br.com.vfcfw.controller.base;

import javax.faces.event.ActionEvent;
import javax.faces.model.DataModel;

import br.com.vfcfw.commons.domain.entity.BaseEntity;

/**
 * Interface que define os métodos que uma tela do tipo CRUD obrigatoriamente precisam possuir e/ou implementar.
 * 
 * @author Vitor Franco do Carmo (vitor.carmo@capgemini.com)
 * @since 28/03/2013
 * 
 */
public interface CRUDFaces<E extends BaseEntity> {

    /**
     * Método para a ação de pesquisar. <p><tt>Por padrão, o Manaded Bean está preparado para usar o {@link DataModel} e
     * paginar por demanda. Para usar a paginação em memória, chamar o método 'setPaginacaoPorDemanda(boolean)', no
     * construtor do Managed Bean, passando o valor <b>false</b>.</tt></p>
     */
    public void pesquisar();

    /**
     * Método para a ação de preparar um registro para inclusão.
     */
    public void preIncluir(ActionEvent event);

    /**
     * Método para a ação de incluir um registro.
     */
    public void incluir();

    /**
     * Método para a ação de preparar um registro para alteração. <p>No link/botão deverá ser passado o objeto que será
     * alterado através de um atributo. <br/><tt>Ex.: &lt;f:attribute name="editar" value="#{result}" /&gt;</tt></p>
     */
    public void preAlterar(ActionEvent event);

    /**
     * Método para a ação de preparar um registro para alteração.
     */
    public void preAlterar(E entity);

    /**
     * Método para a ação de alterar um registro.
     */
    public void alterar();

    /**
     * Método para a ação de preparar um registro para visualização. <p>No link/botão deverá ser passado o objeto que
     * será excluído através de um atributo. <br/><tt>Ex.: &lt;f:attribute name="visualizar" value="#{result}"
     * /&gt;</tt></p>
     */
    public void visualizar(ActionEvent event);

    /**
     * Método para a ação de preparar um registro para visualização.
     */
    public void visualizar(E entity);

    /**
     * Método para a ação de salvar um registro. <p>A abstração verifica o estado do Managed Bean e chama o método
     * 'inserir' caso esteja inserindo, caso contrário, chama o método 'editar'.</p>
     */
    public void salvar();

    /**
     * Método para a ação de excluir o registro selecionado para exclusão.
     */
    public String excluir();

    /**
     * Método para a ação de excluir um registro. <p>No link/botão deverá ser passado o objeto que será excluído através
     * de um atributo. <br/><tt>Ex.: &lt;f:attribute name="editar" value="#{result}" /&gt;</tt></p>
     */
    public void excluir(ActionEvent event);

    /**
     * Método para a ação de excluir um registro.
     */
    public void excluir(E entity);

    /**
     * Método para a ação de cancelar uma inclusão/alteração e voltar para a ação de pesquisar.
     */
    public void cancelar(ActionEvent event);

    /**
     * Método a ser implementado para a ação de limpar os campos da tela (criar uma nova instancia de todos os objetos
     * ligados a ela).
     */
    public void limpar(ActionEvent event);

}
